package com.lab.mapper;

import com.lab.entity.WeeklyReport;
import com.lab.vo.WeeklyReportVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface WeeklyReportMapper {
    /**
     * 根据ID查询周报
     * @param id 周报ID
     * @return 周报信息
     */
    WeeklyReport getById(@Param("id") Integer id);
    
    /**
     * 根据成员ID查询周报列表
     * @param memberId 成员ID
     * @return 周报列表
     */
    List<WeeklyReport> getByMemberId(@Param("memberId") Integer memberId);
    
    /**
     * 根据成员ID查询周报及其内容（关联查询）
     * @param memberId 成员ID
     * @return 周报信息及内容列表
     */
    List<WeeklyReportVO> getReportWithContentsByMemberId(@Param("memberId") Integer memberId);
    
    /**
     * 根据角色类型查询周报及其内容（关联查询）
     * @param roleType 角色类型（前端/后端）
     * @return 周报信息及内容列表
     */
    List<WeeklyReportVO> getReportWithContentsByRoleType(@Param("roleType") String roleType);
    
    /**
     * 根据周数查询周报及其内容（关联查询）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @return 周报信息及内容列表
     */
    List<WeeklyReportVO> getReportWithContentsByWeek(@Param("reportWeek") Integer reportWeek, @Param("reportYear") Integer reportYear);
    
    /**
     * 分页查询周报及其内容（关联查询）
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 周报信息及内容列表
     */
    List<WeeklyReportVO> getReportWithContentsByPage(@Param("offset") Integer offset, @Param("limit") Integer limit);
    
    /**
     * 根据角色类型分页查询周报及其内容（关联查询）
     * @param roleType 角色类型（前端/后端）
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 周报信息及内容列表
     */
    List<WeeklyReportVO> getReportWithContentsByRoleTypeAndPage(@Param("roleType") String roleType, @Param("offset") Integer offset, @Param("limit") Integer limit);
    
    /**
     * 根据成员ID分页查询周报及其内容（关联查询）
     * @param memberId 成员ID
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 周报信息及内容列表
     */
    List<WeeklyReportVO> getReportWithContentsByMemberIdAndPage(@Param("memberId") Integer memberId, @Param("offset") Integer offset, @Param("limit") Integer limit);
    
    /**
     * 查询总记录数
     * @return 总记录数
     */
    Integer countTotal();
    
    /**
     * 根据角色类型查询记录数
     * @param roleType 角色类型
     * @return 记录数
     */
    Integer countByRoleType(@Param("roleType") String roleType);
    
    /**
     * 根据成员ID查询记录数
     * @param memberId 成员ID
     * @return 记录数
     */
    Integer countByMemberId(@Param("memberId") Integer memberId);
    
    /**
     * 根据周数和年份删除周报信息（包括关联的周报内容）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @return 删除的记录数
     */
    Integer deleteByWeekAndYear(@Param("reportWeek") Integer reportWeek, @Param("reportYear") Integer reportYear);

    /**
     * 插入周报信息
     * @param weeklyReport 周报信息
     * @return 影响的行数
     */
    int insert(WeeklyReport weeklyReport);

    /**
     * 根据成员ID、年份和周数查询周报
     * @param memberId 成员ID
     * @param reportYear 年份
     * @param reportWeek 周数
     * @return 周报信息
     */
    WeeklyReport getByMemberIdAndYearAndWeek(
            @Param("memberId") Integer memberId,
            @Param("reportYear") Integer reportYear,
            @Param("reportWeek") Integer reportWeek
    );

    List<WeeklyReportVO> getReportWithContentsByWeekWithoutPagination(Integer reportWeek, Integer reportYear);
}